/**
 * 基于BroadcastChannel的跨窗口通信工具   会有问题,如果是相同项目不同的路会监听undefined
 */
export const broadcastBus = {
  /**
   * 创建/获取频道（单例模式）
   * @param {string} channel 频道名称
   * @returns {BroadcastChannel|null}
   */
  getChannel(channel) {
    if (!window.BroadcastChannel) {
      console.warn('当前环境不支持BroadcastChannel API');
      return null;
    }

    // 使用Symbol防止全局污染
    const CHANNEL_PREFIX = Symbol('broadcast-channel');
    return new BroadcastChannel(`${CHANNEL_PREFIX.description}-${channel}`);
  },

  /**
   * 发送消息（自动管理频道生命周期）
   * @param {string} channel 频道名称
   * @param {any} data 消息数据
   */
  send(channel, data) {
    const bc = this.getChannel(channel);
    if (!bc) return;

    try {
      bc.postMessage(data);
      // 延迟关闭确保消息发送完成
      setTimeout(() => bc.close(), 100);
    } catch (err) {
      console.error('发送BroadcastChannel消息失败:', err);
      bc.close();
    }
  },

  /**
   * 监听消息（返回自动清理的监听器）
   * @param {string} channel 频道名称
   * @param {(data: any) => void} callback 回调函数
   * @returns {{ unsubscribe: () => void }} 销毁方法
   */
  listen(channel, callback) {
    console.log("什么",channel);
    const bc = this.getChannel(channel);
    console.log("---",bc);
    if (!bc) return { unsubscribe: () => {} };

    const handler = (event) => {
      try {
        callback(event.data);
      } catch (err) {
        console.error('BroadcastChannel回调执行失败:', err);
      }
    };

    bc.onmessage = handler;
    bc.onmessageerror = (e) => {
      console.error('BroadcastChannel消息解析失败:', e);
    };

    return {
      unsubscribe: () => {
        bc.onmessage = null;
        bc.onmessageerror = null;
        bc.close();
      }
    };
  }
};
